#ifndef CLIENTTCP_H
#define CLIENTTCP_H

#include <QMainWindow>
#include <QTcpSocket>
#include <QJsonObject>
#include <QList>
#include <QStringList>
#include <QJsonDocument>
#include <QJsonArray> // 确保引入 QJsonArray
#include <QJsonValue> // 确保引入 QJsonValue


// 定义各个数据类型的端口
#define DEFAULT_HOST ("127.0.0.1")
#define LOGIN_PORT (8080);
#define REGISTER_PORT (8081)
#define CONNECT_PROT (8082)

#define USERS_DATA (8888)
#define DOCTORS_DATA (8889)
#define PATIENTS_DATA (8890)
#define MEDICAL_RECORDS_DATA (8891)
#define APPOINTMENTS_DATA (8892)
#define APPOINTMENTS_DATA_2 (9999)
#define MEDICAL_ADVICE_DATA (8893)
#define PRESCRIPTIONS_DATA (8894)
#define COMMUNICATION_DATA (8895)
#define HEALTH_ASSESSMENTS_DATA (8896)
#define INSERT_DATA (8897)
#define DEPARTMENTS_DATA (8898)
#define FAILTED_CODE ("failed")


QT_BEGIN_NAMESPACE
namespace Ui { class ClientTcp; }
QT_END_NAMESPACE

class ClientTcp : public QMainWindow {
    Q_OBJECT

public:
    // 构造函数
    explicit ClientTcp(QWidget *parent = nullptr);
    ClientTcp(const QString &host, qint16 port, QString &str);
    ClientTcp(qint16 port,const QString &host = "127.0.0.1");
    ~ClientTcp();
    // Getter 函数声明
    QList<QJsonObject> getUsersData() const;
      QList<QJsonObject> getDoctorsData() const;
      QList<QJsonObject> getPatientsData() const;
      QList<QJsonObject> getMedicalRecordsData() const;
      QList<QJsonObject> getAppointmentsData() const;
      QList<QJsonObject> getMedicalAdviceData() const;
      QList<QJsonObject> getPrescriptionsData() const;
      QList<QJsonObject> getCommunicationData() const;
      QList<QJsonObject> getHealthAssessmentsData() const;
    bool getFlag() const ;
    void sendMsg(QString &str) const; // 发送消息

    void sendMsg1(QString &str) const;
    QString getCode() const {return CODE;}
    QByteArray getRec() const {return receivedData;}
    QTcpSocket *socket; // TCP Socket
    QList<QJsonObject> getDepartments() const;
private slots:
    // 槽函数声明
      void onInsertData();
    void recJsonFromDepartments();
    void onConnected(); // 处理连接成功
    void onDisconnected(); // 处理断开连接
    void onReadMsg(); // 读取消息
    void recJsonFromUsers(); // 接收用户数据
    void recJsonFromDoctors(); // 接收医生数据
    void recJsonFromPatients(); // 接收患者数据
    void recJsonFromMedicalRecords(); // 接收病历数据
    void recJsonFromAppointments(); // 接收预约数据
    void recJsonFromAppointments_2(); // 接收预约数据
    void recJsonFromMedicalAdvice(); // 接收医疗建议数据
    void recJsonFromPrescriptions(); // 接收处方数据
    void recJsonFromCommunication(); // 接收沟通数据
    void recJsonFromHealthAssessments(); // 接收健康评估数据

private:
    // 处理 JSON 数据的通用函数
    void processJson(const QString &data, const QStringList &keys);

    // 用于存储接收到的数据的容器
    QList<QJsonObject> usersData; // 存储用户数据
    QList<QJsonObject> doctorsData; // 存储医生数据
    QList<QJsonObject> patientsData; // 存储患者数据
    QList<QJsonObject> medicalRecordsData; // 存储病历数据
    QList<QJsonObject> appointmentsData; // 存储预约数据
    QList<QJsonObject> medicalAdviceData; // 存储医疗建议数据
    QList<QJsonObject> prescriptionsData; // 存储处方数据
    QList<QJsonObject> communicationData; // 存储沟通数据
    QList<QJsonObject> healthAssessmentsData; // 存储健康评估数据
    QList<QJsonObject> departmentsData; // 存储健康评估数据

//    Ui::ClientTcp *ui; // UI 组件指针
    QString host; // 主机地址
    qint16 port; // 端口号
    QByteArray receivedData; // 接收到的数据
    QString sendData; // 发送的数据
    QString CODE;
    bool flag;
};

#endif // CLIENTTCP_H

